/*
 * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
 *
 * https://www.mall4j.com/
 *
 * 未经允许，不可做商业用途！
 *
 * 版权所有，侵权必究！
 */
package com.yami.shop.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yami.shop.bean.app.dto.ProductDto;
import com.yami.shop.bean.dto.ProdAndSkuListsDto;
import com.yami.shop.bean.model.OfflineHandleEvent;
import com.yami.shop.bean.model.Product;
import com.yami.shop.bean.param.*;
import com.yami.shop.common.util.PageParam;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 商品
 * @author yami
 */
public interface ProductService extends IService<Product> {

    /**
     * 保存商品
     *
     * @param productParam 商品信息
     */
    void saveProduct(ProductParam productParam);

    /**
     * 更新商品
     *
     * @param product 商品信息
     * @param dbProduct 原有商品信息
     */
    void updateProduct(ProductParam product, Product dbProduct);

    /**
     * 更新注水销量
     * @param waterSoldNum 注水销量
     * @param prodId 产品id
     */
    void updateWaterSaleNum(Integer waterSoldNum,Long prodId);

    /**
     * 根据商品id获取商品信息(商品及商品名称国际化信息)
     *
     * @param prodId 商品id
     * @param dbLang 语言信息
     * @return 商品信息
     */
    Product getProductByProdId(Long prodId, Integer dbLang);


    /**
     * 获取商品信息（商品和商品扩展）(缓存)
     * @param prodId
     * @param dbLang
     * @return
     */
    Product getProductInfo(Long prodId, Integer dbLang);


    /**
     *获取商品信息（商品和商品扩展）
     * @param prodId
     * @return
     */
    Product getProductById(Long prodId);


    /**
     * 移除商品通过商品id
     * @param prodId 商品id
     */
    void removeProductByProdId(Long prodId);

    /**
     * excel保存商品至数据库时删除掉保存失败的商品
     * @param prodId
     */
    void removeExcelProdById(Long prodId);

    /**
     * 获取用户的收藏商品列表
     * @param page 分页数据
     * @param userId 用户id
     * @param dbLang 语言
     * @return 用户的收藏商品列表
     */
    IPage<ProductDto> collectionProds(PageParam page, String userId, Integer dbLang);

    /**
     * 通过商品id和语言移除商品缓存
     * @param prodId 商品id
     */
    void removeProdCacheByProdId(Long prodId);

    /**
     * 批量移除商品缓存通过商品id列表
     * @param prodIds 商品id列表
     */
    void removeProductCacheByProdIds(List<Long> prodIds);

    /**
     * 移除商品扩展信息缓存
     * @param prodId 商品id
     */
    void removeProdExtensionCache(Long prodId);

    /**
     * 通过商品列表获取商品信息及所有规格属性
     * @param prodIds 商品ids
     * @return 商品列表
     */
    List<ProdAndSkuListsDto> getProdAndSkuLists(List<Long> prodIds);

    /**
     * 更新商品为活动商品
     * @param groupActivityId 拼团活动id
     * @param prodId 商品id
     * @return
     */
    int updateProductToGroup(Long groupActivityId, Long prodId);

    /**
     * 违规商品提交审核
     * @param eventId 事件id
     * @param prodId 商品id
     * @param reapplyReason 申请理由
     */
    void auditApply(Long eventId, Long prodId, String reapplyReason);

    /**
     * 商品审核
     * @param offlineHandleEventAuditParam 审核信息
     * @param sysUserId 系统用户id
     */
    void prodAudit(OfflineHandleEventAuditParam offlineHandleEventAuditParam, Long sysUserId);

    /**
     * 平台下线活动
     * @param prodId 商品id
     * @param offlineReason 下线原因
     * @param sysUserId 系统用户id
     */
    void offline(Long prodId, String offlineReason, Long sysUserId);


    /**
     * 获取商品趋势分析
     * @param param 参数
     * @return 获取商品趋势分析
     */
    List<ProdAnalysisDataParam> getProdTrendAnalysis(ProdAnalysisSurveyParam param);

    /**
     * 获取商品效果分析
     * @param page 分页信息
     * @param param 筛选参数
     * @param allProd 获取所有商品
     * @return 获取商品效果分析
     */
    IPage<ProdEffectRespParam> pageProdEffect(PageParam<Product> page,ProdEffectParam param,Integer lang, boolean allProd);


    /**
     * 单个商品的趋势分析
     * @param prodId 商品id
     * @param param 筛选参数
     * @return 单个商品的趋势分析
     */
    List<ProdSingleTrendParam> getSingleProdTrend(Long prodId, ProdEffectParam param);

    /**
     * 分页获取上架的商品信息
     * @param page 分页信息
     * @param product 商品筛选信息
     * @return
     */
    IPage<Product> pageProducts(PageParam<Product> page, ProductParam product);

    /**
     * 筛选获取商品分页列表
     * @param page 分页数据
     * @param product 商品筛选信息
     * @return 商品分页列表
     */
    IPage<Product> pageByLang(PageParam<Product> page, ProductParam product);

    /**
     * 过了预售时间的商品，恢复成普通商品状态
     * @return 商品列表
     */
    List<Product> recoveryPreSaleProd();

//    IPage<ProductTagParam> pageByLangAndTag(PageParam<Product> page, ProductTagParam product, Integer isContain);
    /**
     * 获取商品信息列表
     * @param product 商品筛选信息
     * @return 分页获取商品信息
     */
    List<Product> listProdByIdsAndType(ProductParam product);

    /**
     * 通过商品ids获取商品列表
     * @param prodIds 商品ids
     * @return 商品列表
     */
    List<Product> getProductListBySpuIds(Set<Long> prodIds);

    /**
     * 批量修改商品状态
     * @param pIds
     * @param status
     */
    void changeStatusByProdIds(List<Long> pIds, Integer status);

    /**
     * 更新商品库存
     * @param prodId 商品Id
     * @param skuId skuId
     * @param stocks 更新的库存数量（正数：增加， 负数：减少）
     * @return
     */
    Boolean updateProdAndSkuStock(Long prodId, Long skuId, Integer stocks);

    /**
     * 分页获取商品及商品sku信息
     * @param page
     * @param product
     * @return
     */
    IPage<Product> prodSkuPage(PageParam<Product> page, ProductParam product);

    /**
     * 获取核销时间过期的虚拟商品并进行下架操作
     * @return 过期的虚拟商品
     */
    List<Product> handleExpireVirtualProd();


    /**
     * 处理进入待审核状态的商品
     * @param dbProduct 数据库商品
     * @param offlineHandleEvent 如果审核不通过需要的下线事件
     */
    void handleAuditProd(Product dbProduct, OfflineHandleEvent offlineHandleEvent);

    /**
     * 根据商品、sku Id， 获取商品信息
     * @param prodIds
     * @param skuIds
     * @return
     */
    List<Product> prodAndSkuInfo(List<Long> prodIds, List<Long> skuIds);

    /**
     * 获取商品及sku列表
     * @param prodIds
     * @return
     */
    List<Product> listProdAndSku(List<Long> prodIds);

    /**
     * 更新库存
     * @param prodId
     * @return
     */
    int updateStocks(Long prodId);

    /**
     * 查询可以添加到分销商品的数据
     * @param page
     * @param product
     * @return
     */
    IPage<Product> canDistributionProdPage(PageParam<Product> page, ProductParam product);

    /**
     * 更新商品类型
     * @param prodId
     * @param prodType
     */
    void updateProductType(Long prodId, Integer prodType);

    /**
     * 批量更新商品类型
     * @param prodIds
     * @param prodType
     */
    void bathUpdateProductType(List<Long> prodIds, Integer prodType);

    /**
     * 根据商品id列表获取商品的配送模板id
     * @param prodIds
     * @return
     */
    Map<Long, Product> getProdDeliveryTemplateIdByProdIds(List<Long> prodIds);

}
